#define n 10

// 每根筷子对应一个信号量，每个信号量的初始值为 1
// 每个信号量可以控制哲学家互斥访问对应的筷子
semaphore chopstick[n];
void init() {
    for (int i = 0; i < n; i++) 
        chopstick[i] = 1;
}

semaphore eaters = min(n - 1, m); // 控制就餐哲学家的数量为 n - 1 和 m 的最小者

// 哲学家 i 的活动过程
void philosopher(int i) {

    while (true) {
        thinking();  // 思考

        wait(eaters); // 只有申请 eaters 信号量的才可以就餐
        wait(chopstick[i]); // 获得左边的筷子
        wait(chopstick[(i + 1) % n]); // 获得右边的筷子

        eating();   // 就餐
        signal(chopstick[i]); // 释放左边的筷子
        signal(chopstick[(i + 1) % n]); // 释放右边的筷子
        signal(eaters); // 吃完，通知其他的哲学家
    }

}



